import java.util.concurrent.*;

/**
 * Created with IntelliJ IDEA.
 * Description:JUC中的常见组件
 * User: 邓大帅
 * Date: 2024-01-26
 * Time: 15:01

 JUC:java.util.concurrent
 JUC中的工具类
 Callable:用法类似Runnable，其中包含call方法，相当于带返回参数的run方法

 ReentrantLock:大部分场景下，synchronized足以满足加锁需求，ReentrantLock是一个重要的补充
 synchronized是一个关键字，基于代码块的方式控制加锁解锁 ReentrantLock则是提供了lock和unlock这两个方法来实现加锁解锁
 1.ReentrantLock提供了一个tryLock方法，加锁失败时，会返回false，这样可以方便程序员决定发生锁竞争时要进行什么操作
 2.ReentrantLock提高了公平和非公平两种工作模式(在构造方法中，传入true开启公平锁)
 3.synchronized唤醒线程是随机唤醒等待的线程中的一个，ReentrantLock则是搭配Condition这个类，这个类功能更强大，例如可以实现指定类唤醒

 原子类也属于这个包，原子类基于CAS实现，线程安全且比加锁实现的原子性效率快

 线程池也属于这个包

 信号量也属于这个包 就是操作系统中的那个信号量，用于描述资源数

 CountDownLatch 用于多个线程在跑，最后一个线程结束时CountDownLatch可以感知到
 */
public class ThreadDemo4 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
//        泛型参数传的啥类型，call的返回值就是啥类型
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 0; i < 1000; i++) {
                    sum += i;
                }
                return sum;
            }
        };
        //这里的泛型参数要与call的返回值对应
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        Thread thread = new Thread(futureTask);
        thread.start();
        System.out.println(futureTask.get());//get自带阻塞等待功能，会等call方法执行完
    }
}
